<?php

require_once('../commons_constantes.php');

define('DB_CONNECT'				,0);
define('DB_CONNECTION_GET'		,1);
define('DB_DIE'					,2);
//define('WEDDING_HOST'			,'93.88.241.29');//[93.88.241.29] //mysql.mkinengue.com
define('WEDDING_HOST'			,'localhost');
define('WEDDING_DBNAME'			,'mkinenguecom');
define('WEDDING_USER'			,'MKIRW');
define('WEDDING_PWD'			,'MKI_RW');

/**
 * Initialise une connexion avec la base de données $dbName.
 * Retourne la connexion avec cette base si déjà initialisée ou null sinon.
 * Interrompt la connexion avec la base de données $dbName ou toutes les connexions
 * Retourne null dans tous les cas
 */
function dbConnexionManage
	($getter
	,$dbName = null
	)
{
	static $db = null;
	switch($getter) {
		case DB_CONNECT:
			if (!isset($db[$dbName]) && !is_object($db[$dbName])) {
				$db[$dbName] = new PDO('mysql:host=' . WEDDING_HOST . ';dbname=' . $dbName
									  ,WEDDING_USER
									  ,WEDDING_PWD
									  );
			}
			return null;
			break;
		case DB_CONNECTION_GET:
			if (isset($db[$dbName])) {
				return $db[$dbName];
			}
			return null;
			break;
		case DB_DIE:
			if (isset($dbName) && !is_null($dbName)) {
				$db[$dbName] = null;
			}
			else {
				$db = null;
			}
			return null;
			break;
		default:
			throw new Exception('Fonction dbConnexionManage : accesseur ' . $getter . ' non défini!', ERR_TECHNICAL);
	}
}

/**
 * Fonction d'initialisation d'une connexion avec la base de données $dbName
 */
function dbConnexionInit($dbName) {
	return dbConnexionManage(DB_CONNECT, $dbName);
}

/**
 * Retourne la connexion à la base $dbName
 */
function dbConnexionGet($dbName) {
	return dbConnexionManage(DB_CONNECTION_GET, $dbName);
}

/**
 * Interrompt toute connexion à la base si $dbName = null ou la connexion à la base $dbName sinon
 */
function dbConnexionDie($dbName = null) {
	return dbConnexionManage(DB_DIE, $dbName);
}

/**
 * Exécute la requête $query avec ses éventuels paramètres liés $bindings
 * Retourne le résultat de l'exécution (un objet) en cas de succès et null sinon
 */
function dbQueryExecution($dbName
						 ,$query
						 ,$bindings = null
						 )
{
	dbConnexionInit($dbName);
	$dbConnect = dbConnexionGet($dbName);
	$stmt = $dbConnect -> prepare($query);
	$exec = $stmt -> execute($bindings);
	if($exec === true) {
		return $stmt;
	}
	else {
		return null;
	}
}

/**
 * Retourne le tableau de la ligne récupérée en base avec comme indices de tableau les colonnes récupérées
 * Retourne null en cas d'échec
 */
function dbFetch($sql) {
	$result = $sql -> fetch(PDO::FETCH_NAMED);
	if ($result === false) {
		return null;
	}
	return $result;
}

/**
 * Retourne le tableau des lignes récupérées en base avec comme indices de tableau pour chaque entrée les colonnes récupérées
 */
function dbFetchAll($sql) {
	$results = $sql -> fetchAll(PDO::FETCH_NAMED);
	return $results;
}

/**
 * Retourne le tableau des éléments du statement en entrée, contenant les résultats d'un select d'une requête
 * @param Statement $stmt
 * @return array
 */
function dbFetchAllFromStatement($stmt) {
	$results = dbFetchAll($stmt);
	$theResults = array();
	foreach ($results as $key => $aryVal) {
		//$theResults[$key] = array_map(htmlDecode, $aryVal);
		$aryRes = array();
		foreach ($aryVal as $key2 => $elt) {
			$aryRes[$key2] = htmlDecode($elt);
		}
		$theResults[$key] = $aryRes;
	}
	return $theResults;
}
